#!/usr/bin/env node

// 永久解决方案脚本
const { execSync } = require('child_process');
const fs = require('fs');

console.log("🔧 永久解决方案脚本");

// 1. 系统清理
function systemCleanup() {
  console.log("1. 系统清理...");
  
  // 停止可能冲突的进程
  try {
    execSync('sudo killall pigpiod 2>/dev/null || true');
    console.log("   ✅ 已停止pigpio进程");
  } catch (error) {
    console.log("   ℹ️  未发现pigpio进程");
  }
  
  // 停止GPIO进程
  try {
    execSync('sudo pkill -f "gpio.js" 2>/dev/null || true');
    console.log("   ✅ 已停止GPIO进程");
  } catch (error) {
    console.log("   ℹ️  未发现GPIO进程");
  }
}

// 2. GPIO初始化
function initializeGPIO() {
  console.log("2. GPIO初始化...");
  
  try {
    execSync('gpio -g mode 12 out');
    execSync('gpio -g mode 13 out');
    console.log("   ✅ GPIO引脚初始化完成");
    return true;
  } catch (error) {
    console.log("   ❌ GPIO初始化失败:", error.message);
    return false;
  }
}

// 3. 电调校准
function calibrateESC() {
  console.log("3. 电调校准...");
  
  try {
    // 发送初始化信号
    sendPWMSignal(13, 1.5, 1000);
    
    // 最大油门信号
    console.log("   发送最大油门信号...");
    sendPWMSignal(13, 2.0, 5000);
    
    // 最小油门信号
    console.log("   发送最小油门信号...");
    sendPWMSignal(13, 1.0, 5000);
    
    // 中性信号
    console.log("   发送中性信号...");
    sendPWMSignal(13, 1.5, 2000);
    
    console.log("   ✅ 电调校准完成");
    return true;
  } catch (error) {
    console.log("   ❌ 电调校准失败:", error.message);
    return false;
  }
}

// 4. 测试控制
function testControl() {
  console.log("4. 控制测试...");
  
  try {
    // 中性信号
    console.log("   发送中性信号...");
    sendPWMSignal(12, 1.5, 1000);
    sendPWMSignal(13, 1.5, 1000);
    
    // 前进信号
    console.log("   发送前进信号...");
    sendPWMSignal(13, 1.7, 2000);
    
    // 回到中性
    console.log("   回到中性...");
    sendPWMSignal(13, 1.5, 1000);
    
    console.log("   ✅ 控制测试完成");
    return true;
  } catch (error) {
    console.log("   ❌ 控制测试失败:", error.message);
    return false;
  }
}

// 5. 创建系统服务
function createSystemService() {
  console.log("5. 创建系统服务...");
  
  const serviceContent = `[Unit]
Description=Network RC GPIO Service
After=multi-user.target

[Service]
Type=simple
ExecStart=/home/pi/.nvm/versions/node/v20.19.0/bin/node /home/pi/dev/network-rc/lib/gpio.js
Restart=always
User=root

[Install]
WantedBy=multi-user.target`;

  try {
    fs.writeFileSync('/etc/systemd/system/network-rc-gpio.service', serviceContent);
    execSync('sudo systemctl daemon-reload');
    console.log("   ✅ 系统服务创建完成");
    return true;
  } catch (error) {
    console.log("   ❌ 系统服务创建失败:", error.message);
    return false;
  }
}

// 发送PWM信号函数
function sendPWMSignal(pin, dutyCycleMs, durationMs) {
  const periodMs = 20; // 50Hz = 20ms周期
  const highTimeMs = dutyCycleMs;
  const lowTimeMs = periodMs - dutyCycleMs;
  
  const cycles = Math.floor(durationMs / periodMs);
  
  for (let i = 0; i < cycles; i++) {
    execSync(`gpio -g write ${pin} 1`);
    sleep(highTimeMs);
    execSync(`gpio -g write ${pin} 0`);
    sleep(lowTimeMs);
  }
}

// 精确延时函数（毫秒）
function sleep(ms) {
  const start = Date.now();
  while (Date.now() - start < ms) {
    // 空循环等待
  }
}

// 主函数
function main() {
  console.log("🚀 开始执行永久解决方案");
  
  systemCleanup();
  
  if (!initializeGPIO()) {
    console.log("\n❌ GPIO初始化失败，无法继续");
    return;
  }
  
  if (!calibrateESC()) {
    console.log("\n⚠️  电调校准失败，但将继续测试");
  }
  
  if (!testControl()) {
    console.log("\n❌ 控制测试失败");
  } else {
    console.log("\n✅ 控制测试成功");
  }
  
  console.log("\n📋 解决方案执行完成");
  console.log("\n💡 如果小车仍然无法控制，请检查:");
  console.log("   1. 硬件连接是否正确");
  console.log("   2. 电源供应是否充足");
  console.log("   3. 电调和电机是否正常工作");
  console.log("   4. 是否需要参考电调说明书进行特殊校准");
}

// 执行主函数
main();